//import org.opencv.core.*;
//import org.opencv.imgcodecs.Imgcodecs;
//import org.opencv.imgproc.Imgproc;
//import org.opencv.photo.Photo;
//
//import javax.imageio.ImageIO;
//import java.awt.image.BufferedImage;
//import java.io.ByteArrayInputStream;
//import java.io.ByteArrayOutputStream;
//import java.nio.file.*;
//
//public class WatermarkRemover {
//  static {
//    loadOpenCVLibrary();
//  }
//
//  private static void loadOpenCVLibrary() {
//    String libPath = "F:\\gitee\\personal-blog-document\\javaProject\\opencv_java451.dll";
//    System.load(libPath);
//    System.out.println("成功加载OpenCV库: " + libPath);
//  }
//
//  public static void main(String[] args) {
//    // 强制统一编码（解决中文乱码核心）
//    System.setProperty("file.encoding", "UTF-8");
//
//    Path imageBaseDir = Paths.get("F:\\gitee\\personal-blog-document\\image");
//    Path outputDir = Paths.get("F:\\gitee\\personal-blog-document\\image_no_watermark");
//    try {
//      Files.createDirectories(outputDir);
//    } catch (Exception e) {
//      System.err.println("创建输出目录失败: " + e.getMessage());
//      return;
//    }
//    processImages(imageBaseDir, outputDir);
//    System.out.println("水印清除完成！处理后的图片保存在: " + outputDir);
//  }
//
//  private static void processImages(Path inputDir, Path outputDir) {
//    try {
//      Files.walk(inputDir)
//          .filter(Files::isRegularFile)
//          .filter(path -> {
//            String name = path.toString().toLowerCase();
//            return name.endsWith(".png") || name.endsWith(".jpg") || name.endsWith(".jpeg");
//          })
//          .forEach(path -> removeWatermark(path, inputDir, outputDir));
//    } catch (Exception e) {
//      e.printStackTrace();
//    }
//  }
//
//  private static void removeWatermark(Path imagePath, Path inputBaseDir, Path outputBaseDir) {
//    try {
//      // 1. 安全读取图像（解决中文路径问题）
//      Mat src = safeImageRead(imagePath);
//      if (src.empty()) {
//        System.err.println("无法解码图像: " + imagePath);
//        return;
//      }
//
//      // 2. 通道转换
//      Mat processedSrc = new Mat();
//      if (src.channels() == 4) {
//        Imgproc.cvtColor(src, processedSrc, Imgproc.COLOR_RGBA2RGB);
//        src.release();
//      } else if (src.channels() == 1) {
//        Imgproc.cvtColor(src, processedSrc, Imgproc.COLOR_GRAY2RGB);
//        src.release();
//      } else {
//        processedSrc = src;
//      }
//
//      // 3. 创建水印区域掩码（右下角10%）
//      Mat mask = new Mat(processedSrc.size(), CvType.CV_8U, Scalar.all(0));
//      Rect watermarkRegion = new Rect(
//          (int) (processedSrc.cols() * 0.8),
//          (int) (processedSrc.rows() * 0.9),
//          (int) (processedSrc.cols() * 0.2),
//          (int) (processedSrc.rows() * 0.1)
//      );
//      Imgproc.rectangle(mask, watermarkRegion, new Scalar(255), -1);
//
//      // 4. 图像修复（Telea算法）
//      Mat result = new Mat();
//      Photo.inpaint(processedSrc, mask, result, 3, Photo.INPAINT_TELEA);
//
//      // 5. 计算并创建输出路径
//      Path relativePath = inputBaseDir.relativize(imagePath.getParent());
//      Path outputDir = outputBaseDir.resolve(relativePath);
//      Files.createDirectories(outputDir);
//      Path outputPath = outputDir.resolve(imagePath.getFileName().toString());
//
//      // 6. 保存图像
//      Imgcodecs.imwrite(outputPath.toString(), result);
//      System.out.println("已处理: " + imagePath + " -> " + outputPath);
//
//      // 释放资源
//      processedSrc.release();
//      mask.release();
//      result.release();
//    } catch (Exception e) {
//      System.err.println("处理失败[" + imagePath + "]:");
//      e.printStackTrace();
//    }
//  }
//
//  // 安全读取方法（兼容中文路径）
//  private static Mat safeImageRead(Path imagePath) {
//    try {
//      // 直接读取文件字节（避免文件名编码问题）
//      byte[] imageBytes = Files.readAllBytes(imagePath);
//      ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);
//
//      BufferedImage buffImg = ImageIO.read(inputStream);
//      if (buffImg == null) {
//        System.err.println("ImageIO无法读取: " + imagePath);
//        return new Mat();
//      }
//
//      // 转换为三通道RGB格式
//      BufferedImage convertedImg = new BufferedImage(
//          buffImg.getWidth(),
//          buffImg.getHeight(),
//          BufferedImage.TYPE_INT_RGB
//      );
//      convertedImg.getGraphics().drawImage(buffImg, 0, 0, null);
//
//      ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
//      ImageIO.write(convertedImg, "jpg", byteStream);
//
//      return Imgcodecs.imdecode(new MatOfByte(byteStream.toByteArray()), Imgcodecs.IMREAD_COLOR);
//    } catch (Exception e) {
//      System.err.println("安全读取失败: " + imagePath);
//      e.printStackTrace();
//      return new Mat();
//    }
//  }
//}
